//=============================================================================
// System  : MatchKit
// File    : MatchableMemberAttribute.cs
// Author  : Fabio Bussu  (matchkit@fabiobussu.it)
// Updated : 04/16/2013
// Note    : Copyright 2013, Fabio Bussu, All rights reserved
//
// This code is published under the Microsoft Public License (Ms-PL). A copy
// of the license should be distributed with the code.  It can also be found
// at the project website: http://matchkit.codeplex.com. This notice, the
// author's name, and all copyright notices must remain intact in all
// applications, documentation, and source files.
//
// Version     Date     Who  Comments
// ============================================================================
// 1.0.0.0  04/16/2013   FB  First draft
//=============================================================================
using System;
using System.Runtime.Serialization;

namespace MatchKit.ObjectMapping
{
	/// <summary>
	/// Indicates that a field or property is matchable.
	/// </summary>
	/// <conceptualLink target="7e345cd8-5aaa-2703-a3c9-abcc9344dabc" />
	/// <conceptualLink target="7e399cd8-5aaa-4616-a3c9-a9979344dabc" />
	/// <conceptualLink target="7e345cd8-5aaa-2703-9876-abcc9344dabc" />
	/// <conceptualLink target="7e34abc9-5aaa-4616-a3c9-abcd0544dabc" />
	/// <conceptualLink target="0a06b2a9-5f58-409a-ba62-639cfd77bca7" />
	[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
	public sealed class MatchableMemberAttribute : Attribute
	{
		/// <summary>
		/// Gets the priority which the attribute is evaluated by the matching process.
		/// </summary>
		public int Position { get; private set; }

		/// <summary>
		/// Gets or sets a value specifying whether the match of the member is optional.
		/// <br />
		/// Default value is <b>false</b>.
		/// </summary>
		public bool IsOptional { get; set; }

		/// <summary>
		/// Gets or sets a value specifying whether the member is considered the last member of a matchable class; 
		/// this property implicitly set <see cref="P:MatchKit.MatchableMemberAttribute.IsOptional"/> to <b>true</b>. 
		/// <br />
		/// Default value is <b>false</b>.
		/// </summary>
		public bool IsFinalIfNotFound { get; set; }

		/// <summary>
		/// Gets or sets a value specifying whether the member is matched based on the <i>runtime</i> value rather than 
		/// the initialization value setted at the object construction. 
		/// <br />
		/// Default value is <b>false</b>.
		/// </summary>
		/// <conceptualLink target="7e345cd8-5aaa-2703-a3c9-abcc9344dabc" />
		public bool IsDynamic { get; set; }

		/// <summary>
		/// Gets or sets a value specifying whether the member is a point of no return. If the match on this member 
		/// has success, the first error match error at same or children level will thrown a <see cref="T:MatchKit.MatchFailedException"/>. 
		/// <br />
		/// Default value is <b>false</b>.
		/// </summary>
		/// <conceptualLink target="7e345cd8-5aaa-2703-9876-abcc9344dabc" />
		public bool IsPointOfNoReturn { get; set; }

		/// <summary>
		/// Gets or sets a value specifying whether the member is the separator element in case of the class is matched as an array. 
		/// If the class is matched as single class this member will be ignored. This type of member is implicitly optional.
		/// <br />
		/// Default value is <b>false</b>.
		/// </summary>
		/// <conceptualLink target="7e34abc9-5aaa-4616-a3c9-abcd0544dabc" />
		public bool IsSeparatorElement { get; set; }

		/// <summary>
		/// Gets or sets the Type where to find the <see cref="P:MatchKit.MatchableMemberAttribute.GetPatternsMethod"/>. If null, 
		/// <see cref="P:MatchKit.MatchableMemberAttribute.GetPatternsMethod"/> is searched inside the declaring type of the member.
		/// <br />
		/// Default value is <b>null</b>.
		/// </summary>
		public Type GetPatternsMethodType { get; set; }

		/// <summary>
		/// Gets or sets the method to evaluate at runtime the list of patterns to apply to the member. The method can be located 
		/// or inside the class declaring the member or inside a type specified by <see cref="P:MatchKit.MatchableMemberAttribute.GetPatternsMethod"/>.
		/// <br />
		/// Default value is <b>null</b>.
		/// </summary>
		/// <conceptualLink target="7e399cd8-5aaa-4616-a3c9-a9979344dabc" />
		public string GetPatternsMethod { get; set; }

		/// <summary>
		/// Gets or sets a value specifying whether the blank ignoring logic must be suspended after the current member. 
		/// Blanks after the current member will be matched by the process. This property is used only with a successfull 
		/// match for the member.
		/// <br />
		/// Default value is <b>false</b>.
		/// </summary>
		public bool SuspendBlankIgnoringAfterMember { get; set; }

		/// <summary>
		/// Initializes a new instance of the <see cref="T:MatchKit.MatchableMemberAttribute"/> class.
		/// </summary>
		/// <param name="position">Priority which the attribute is evaluated by the matching process.</param>
		public MatchableMemberAttribute(int position)
		{
			Position = position;
			IsOptional = false;
			IsFinalIfNotFound = false;
			IsDynamic = false;
			IsPointOfNoReturn = false;
			IsSeparatorElement = false;
			GetPatternsMethod = null;
		}
	}
}
